home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / saru / g1.c < prev    next >
C/C++ Source or Header  |  1999-06-15  |  19KB  |  1,088 lines

  1. /*
  2. CD-DA直接もぐらたたき?
  3. by 電魔団\shoryu 1999 for G7
  4. */
  5.  
  6. #include    <stdio.h>
  7. #include    <stdlib.h>
  8. #include    <string.h>
  9. #include    <basic0.h>
  10. #include    <iocslib.h>
  11. #include    <doslib.h>
  12.  
  13.  
  14. extern    char    PCM_1005_001[],        //ウキやっつけ音
  15.         PCM_1005_003[],        //GAMEOVER音
  16.         PCM_AXE0004[];        //からぶり音
  17.  
  18. extern    int    PCMSIZE_1005_001,PCMSIZE_1005_003,PCMSIZE_AXE0004;    //サイズ
  19.  
  20. unsigned char    Toc[804]={ 0x43,0,    //TOC読み込みコマンド&データバッファ
  21.         0,0,0,0,
  22.         2,0x3,0x24,0};
  23.  
  24.  
  25. typedef    struct    {
  26.     int    start_addr;        //アブソリュートCD-ROM開始アドレス
  27.     int    track_len;        //アブソリュートトラック長
  28. } TRACK;
  29.  
  30.  
  31. //CD本来のTOC情報
  32. TRACK    Track[100];            //[0]は全体、[普通に曲番号]が入る
  33.                     //インデックスの曲番号に「0xaa」てのがあるので注意
  34.  
  35.  
  36. //ウキ音(L000+R000+L050+R050+)のvTRACK
  37. //CD-DAアブショリュートアドレス、アブソリュート長
  38. #define        VTRACKS        (18*2)
  39. TRACK    vTrack[VTRACKS]={            //?=LorR
  40.     {0,74},        {75,74},        //?000
  41.     {150,74},    {225,74},        //?050
  42.     {300,74},    {375,74},        //?100
  43.     {450,74},    {525,74},        //?150
  44.     {600,74},    {675,74},        //?200
  45.     {750,74},    {825,74},        //?250
  46.     {900,74},    {975,74},        //?300
  47.     {1050,74},    {1125,74},        //?350
  48.     {1200,74},    {1275,74},        //?400
  49.     {1350,74},    {1425,74},        //?450
  50.     {1500,74},    {1575,74},        //?500
  51.     {1650,74},    {1725,74},        //?550
  52.     {1800,74},    {1875,74},        //?600
  53.     {1950,74},    {2025,74},        //?650
  54.     {2100,74},    {2175,74},        //?700
  55.     {2250,74},    {2325,74},        //?750
  56.     {2400,74},    {2475,74},        //?800
  57.     {2550,74},    {2625,74}        //?850
  58. };
  59.  
  60. char    *Guide[VTRACKS]={
  61. //    "ASDF JKL;",
  62.     "   F J   ",    //L000
  63.     "   F J   ",    //R000
  64.  
  65.     "   F     ",    //L050
  66.     "     J   ",    //R050
  67.     "   F     ",    //L100
  68.     "     J   ",    //R100
  69.  
  70.     "  DF     ",    //L150
  71.     "     JK  ",    //R150
  72.     "  DF     ",    //L200
  73.     "     JK  ",    //R200
  74.  
  75.     "  D      ",    //L250
  76.     "      K  ",    //R250
  77.     "  D      ",    //L300
  78.     "      K  ",    //R300
  79.     "  D      ",    //L350
  80.     "      K  ",    //R350
  81.  
  82.     " SD      ",    //L400
  83.     "      KL ",    //R400
  84.     " SD      ",    //L450
  85.     "      KL ",    //R450
  86.  
  87.     " S       ",    //L500
  88.     "       L ",    //R500
  89.     " S       ",    //L550
  90.     "       L ",    //R550
  91.     " S       ",    //L600
  92.     "       L ",    //R600
  93.  
  94.     "AS       ",    //L650
  95.     "       L;",    //R650
  96.     "AS       ",    //L700
  97.     "       L;",    //R700
  98.  
  99.     "A        ",    //L750
  100.     "        ;",    //R750
  101.     "A        ",    //L800
  102.     "        ;",    //R800
  103.     "A        ",    //L850
  104.     "        ;"    //R850
  105. };
  106.  
  107.  
  108. char    *DirInfo[VTRACKS]={
  109.     "   ← 00度     ",
  110.     "     00度 →   ",
  111.     "   ← 05度     ",
  112.     "     05度 →   ",
  113.     "   ← 10度     ",
  114.     "     10度 →   ",
  115.     "   ← 15度     ",
  116.     "     15度 →   ",
  117.  
  118.     "  ←← 20度     ",
  119.     "     20度 →→  ",
  120.     "  ←← 25度     ",
  121.     "     25度 →→  ",
  122.     "  ←← 30度     ",
  123.     "     30度 →→  ",
  124.     "  ←← 35度     ",
  125.     "     35度 →→  ",
  126.     "  ←← 40度     ",
  127.     "     40度 →→  ",
  128.  
  129.     " ←←← 45度     ",
  130.     "     45度 →→→ ",
  131.     " ←←← 50度     ",
  132.     "     50度 →→→ ",
  133.     " ←←← 55度     ",
  134.     "     55度 →→→ ",
  135.     " ←←← 60度     ",
  136.     "     60度 →→→ ",
  137.     " ←←← 65度     ",
  138.     "     65度 →→→ ",
  139.  
  140.     "←←←← 70度     ",
  141.     "     70度 →→→→",
  142.     "←←←← 75度     ",
  143.     "     75度 →→→→",
  144.     "←←←← 80度     ",
  145.     "     80度 →→→→",
  146.     "←←←← 85度     ",
  147.     "     85度 →→→→"
  148.  
  149. };
  150.  
  151.  
  152.  
  153. typedef    struct    {
  154.     int    kg,kd;            //トリガとなるキーグループとキーデータ(ビット番号にあらず)
  155.     int    start_addr;        //アブソリュートCD-ROM開始アドレス
  156.     int    track_len;        //アブソリュートトラック長
  157. } TRACKOFF;
  158.  
  159. //バラバラ再生用トラックオフセット
  160. #define        TRACKOFFS    (8)
  161. TRACKOFF    Troff[TRACKOFFS]={
  162. //    キー        開始オフセット    再生時間
  163.     {3,0x40,     1000,        50},    //'A'
  164.     {3,0x80,     1075,        50},    //'S'
  165.     {4,0x01,     1150,        50},    //'D'
  166.     {4,0x02,     1225,        50},    //'F'
  167.  
  168.     {4,0x10,     1300,        50},    //'J'
  169.     {4,0x20,     1375,        50},    //'K'
  170.     {4,0x40,     1450,        50},    //'L'
  171.     {4,0x80,     1525,        50}    //';'
  172. };
  173.  
  174.  
  175.  
  176.  
  177.  
  178. typedef    struct    {
  179.     int    kb[0x10];    //キー情報
  180.  
  181.     int    anskey;        //ASDFJKL;=12345678/入力無し=0
  182. } DEVICE;
  183.  
  184. DEVICE    Dev,oDev;
  185. int    prohiTime;    //ASDF入力禁止カウンタ
  186.  
  187.  
  188. //ASDFJKL;に対応するvTrackの番号
  189. int    HitTable_A[]= {34,32,30,28,26,-1};        //A
  190. int    HitTable_S[]= {28,26,24,22,20,18,16,-1};    //S
  191. int    HitTable_D[]= {18,16,14,12,10, 8, 6,-1};    //D
  192. int    HitTable_F[]= { 8, 6, 4, 2, 0, 1,-1};        //F
  193.  
  194. int    HitTable_J[]= { 0, 1, 3, 5, 7, 9,-1};        //J
  195. int    HitTable_K[]= { 7, 9,11,13,15,17,19,-1};    //K
  196. int    HitTable_L[]= {17,19,21,23,25,27,29,-1};    //L
  197. int    HitTable_SC[]={27,29,31,33,35,-1};        //;
  198.  
  199. int    *HitTable[8+1]={
  200.     NULL,                        //NULL
  201.     HitTable_A,HitTable_S,HitTable_D,HitTable_F,
  202.     HitTable_J,HitTable_K,HitTable_L,HitTable_SC
  203. };
  204.  
  205.  
  206. #define        TRUE    (0)
  207. #define        FALSE    (-1)
  208. int    exit_flag=FALSE;
  209.  
  210. int    DB=0;            //デバッグ情報1=ON/0=OFF
  211. int    HINT=0;            //
  212.  
  213. //システム用
  214. int    SCSI_ID;        //CD-ROMドライブのSCSI-ID
  215. int    CDDA_TRACK;        //ウキのデータが入ったCDDAトラック番号
  216.  
  217. int    PlayStartTime;        //今鳴っているトラックを演奏開始した時間
  218. int    PlayNumber;        //      トラック番号
  219. int    AnswerTime;        //回答制限時間
  220.  
  221. int    Score;            //得点
  222. int    MissCount;        //ミスカウント
  223.  
  224. int    gameCondition;        //現在のゲームコンディション
  225.  
  226. int    gameLevel;        //ゲームレベル
  227.  
  228. int    AnswerTimeTBL[]={500,400,150,300,250,100};    // 1/100タイマ
  229. int    prohiTimeTBL[]={90,90,25,50,40,25};        // V-sync
  230.  
  231.  
  232. enum    GCND    {
  233.     ALL_INIT,
  234.  
  235.     DEMO_INIT,
  236.     DEMO,
  237.  
  238.     COUNTDOWN_INIT,
  239.     COUNTDOWN,
  240.  
  241.     PLAY_TRACK,
  242.     WAIT_ANSWER,
  243.     GOOD_ANSWER_INIT,
  244.     GOOD_ANSWER,
  245.     BAD_ANSWER_INIT,
  246.     BAD_ANSWER,
  247.     TIMEOUT_ANSWER_INIT,
  248.     TIMEOUT_ANSWER,
  249.     WAIT_NEXT,
  250.     
  251.     LEVEL_CONTROL,
  252.     
  253.     GAMEOVER_INIT,
  254.     GAMEOVER
  255. };
  256.  
  257.  
  258. unsigned short    TPALET0;        //画面フラッシュ用:通常=0
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266. int    HiScore;
  267. int    totalCnt,    hitCnt,        outCnt;
  268. int    karaburiCnt;
  269.  
  270.  
  271.  
  272.  
  273. int    PrintTitle()
  274. {
  275.     locate(0,0);    printf(" ←↑さるばとる↑→ ");
  276.  
  277.     return(0);
  278. }
  279.  
  280.  
  281. int    PrintInfo()
  282. {
  283.     locate(0,0);    printf("おさるの出現数:%02d",totalCnt);
  284.     locate(0,1);    printf("やった数   :%02d",hitCnt);
  285.     locate(0,2);    printf("やられた数  :%02d",outCnt);
  286.  
  287.     return(0);
  288. }
  289.  
  290.  
  291. int    PrintSubInfo(fnc)
  292. int    fnc;    //0=消去・1=表示
  293. {
  294.     int    rt;
  295.  
  296.     locate(0,3);
  297.     switch(fnc){
  298.         case 0:
  299.             printf("   ");
  300.         break;
  301.         
  302.         case 1:
  303.             if( prohiTime ){
  304.                 printf("%03d",prohiTime-1);
  305.             }
  306.             else{
  307.                 rt=(PlayStartTime+AnswerTime)-ONTIME();
  308.                 printf("%03d",rt);
  309.             }
  310.         break;
  311.     }
  312.  
  313.     return(0);
  314. }
  315.  
  316.  
  317. int    PrintAns()
  318. {
  319.     locate(0+7,4);    printf(Guide[PlayNumber]);
  320.  
  321.     return(0);
  322. }
  323.  
  324.  
  325. int    PrintDemo(fn)
  326. int    fn;
  327. {
  328.     char    *mes[2]={
  329.         "             ",
  330.         "DEMONSTRATION"
  331.     };
  332.     locate(0+4,5);    printf(mes[fn]);
  333.  
  334.     return(0);
  335. }
  336.  
  337.  
  338. int    PrintPush(fn)
  339. int    fn;
  340. {
  341.     char    *mes[2]={
  342.         "             ",
  343.         "PUSH ASDF-key"
  344.     };
  345.     locate(0+4,5);    printf(mes[fn]);
  346.  
  347.     return(0);
  348. }
  349.  
  350.  
  351. int    PrintDirInfo()
  352. {
  353.     locate(0,6);    printf(DirInfo[PlayNumber]);
  354.  
  355.     return(0);
  356. }
  357.  
  358.  
  359.  
  360.  
  361.  
  362. int    DevMan()
  363. {
  364.     int    kg;
  365.             //    A    S    D    F    J    K    L    ;
  366.     int    akg[9]={0,    3,   3,   4,   4,    4,   4,   4,   4},
  367.         akb[9]={0,    0x40,0x80,0x01,0x02,    0x10,0x20,0x40,0x80};
  368.  
  369.     oDev=Dev;
  370.     for( kg=0; kg<0x10; kg++ ){
  371.         Dev.kb[kg]=BITSNS(kg);
  372.     }
  373.  
  374.     //ASDFJKL;キー判定
  375.     Dev.anskey=0;
  376.     if( prohiTime==0 ){
  377.         for( kg=1;kg<=8;kg++ ){
  378.             if( Dev.kb[akg[kg]]==akb[kg] && oDev.kb[akg[kg]]==0 ){
  379.                 Dev.anskey=kg;
  380.             }
  381.         }
  382.     }
  383.     else{
  384.         prohiTime--;
  385.     }
  386.  
  387.     
  388.     return(0);
  389. }
  390.  
  391.  
  392.  
  393.  
  394.  
  395. int    SyncMan()
  396. {
  397.     int    ssp;
  398.     volatile    unsigned char    *gpip=(unsigned char *)0xE88001;
  399.     unsigned short    *tpal0=(unsigned short *)0xe82200;
  400.     
  401.     ssp=B_SUPER(0);
  402.     if( !((*gpip)&0x10) ){
  403.         while( !((*gpip)&0x10) );
  404.     }
  405.     while( (*gpip)&0x10 );
  406.  
  407.     *tpal0=TPALET0;
  408.     
  409.     B_SUPER(ssp);
  410.  
  411.     return(0);
  412. }
  413.  
  414.  
  415.  
  416.  
  417.  
  418. int    TOCRead(scsi_id)
  419. int    scsi_id;
  420. {
  421.     unsigned char    buf[256];    //@@かなり適当
  422.     int    retry;
  423.     int    st;
  424.     int    res=0;
  425.  
  426.     
  427.     //使えるかどうかチェック    inquiry
  428.     //メディアチェック        testunit
  429.     if( S_SELECT(scsi_id)!=0 ){            //SCSI-ID
  430.         res=-1;
  431.         goto quick_exit;
  432.     }
  433.     retry=0;
  434.     while( (st=S_CMDOUT(10,Toc))!=0 ){retry++;}    //コマンド発行
  435. printf("cmd-out:%d\n",retry);
  436. printf("ST:%x\n",st);
  437.  
  438.     retry=0;
  439.     while( (st=S_DATAIN(sizeof(Toc),Toc))!=0 ){
  440.         printf("<%d>",st);
  441.         retry++;
  442.  
  443.         /*
  444.             S_DATAIN()の戻り値でなく、
  445.             入力バッファの中身を見て判断するしかないのか?
  446.         */
  447.         if( Toc[0]!=0x43 ){
  448.             printf("バッファ更新\n");
  449.             break;
  450.         }
  451.         if( retry==15 ){
  452.             printf("S_DATAINでエラー\n");
  453.             res=-1;
  454.             goto quick_exit;
  455.             break;
  456.         }
  457.     }
  458. printf("DT-IN retry=%d\n",retry);
  459. printf("ST:%x\n",st);
  460.  
  461.     retry=0;
  462.     while( (st=S_STSIN(buf))!=0 ){        //ステータスインフェーズ
  463.         retry++;
  464.         if( retry==15 ){
  465.             printf("S_STSINでエラー\n");
  466.             res=-2;
  467.             goto quick_exit;
  468.             break;
  469.         }
  470.     }
  471. printf("ST-IN retry=%d\n",retry);
  472. printf("ST:%x\n",st);
  473.  
  474.     
  475.     S_MSGIN(buf);        //メッセージインフェーズ
  476.  
  477. {
  478.     int    i,n,tr;
  479.     printf("TOCデータ長:%02X%02X\n",Toc[0],Toc[1]);
  480.     printf("先頭トラック番号:%02X\n",Toc[2]);
  481.     printf("最終トラック番号:%02X\n",Toc[3]);
  482.     
  483.     tr=0;    Track[tr].start_addr=0;            //全体開始
  484.     tr=1;    Track[tr].start_addr=0;
  485.     for( n=0,tr=2,i=Toc[2];i<=Toc[3];n++,tr++,i++ ){
  486.         Track[tr].start_addr=*(int *)(&Toc[4+n*8+4]);
  487. printf("トラック番号:%02x \n",Toc[4+n*8+2]);
  488. printf("アブソリュートCD-ROM開始アドレス:%08X\n",*(int *)(&Toc[4+n*8+4]));
  489.     }
  490.     Track[0].track_len=Track[tr-1].start_addr;    //全体終了
  491.  
  492.     for( tr=1,i=Toc[2];i<=Toc[3];tr++,i++ ){
  493.         Track[tr].track_len=Track[tr+1].start_addr-Track[tr].start_addr-1;
  494.     }
  495.  
  496.     for( n=0,i=Toc[2];i<=Toc[3];n++,i++ ){
  497. printf("%d:%x-%x\n",n,Track[n].start_addr,Track[n].track_len);
  498.     }
  499. }
  500.  
  501. quick_exit:
  502.     return(res);
  503.  
  504. }
  505.  
  506.  
  507.  
  508.  
  509. int    AbsPlay(scsi_id,start,len)
  510. int    scsi_id,start,len;        //アブショリュート値で指定
  511. {
  512.     //p.246
  513. //                    start        end
  514.     unsigned char    cmd[]={ 0xa5,0,    0,0,0,0,    0,0,0,0,    0,0};
  515.     unsigned char    buf[256];    //@@かなり適当
  516.  
  517.     *(int *)(&cmd[2])=start;
  518.     *(int *)(&cmd[6])=len;
  519.     
  520.     //使えるかどうかチェック    inquiry
  521.     //メディアチェック    testunit
  522.     S_SELECT(scsi_id);    //SCSI-ID
  523.     S_CMDOUT(12,cmd);    //再生コマンド発行
  524.     S_STSIN(buf);        //ステータスインフェーズ
  525.     S_MSGIN(buf);        //メッセージインフェーズ
  526.  
  527.     return(0);
  528. }
  529.  
  530.  
  531.  
  532.  
  533. /*
  534.     指定したvTrackの再生
  535. */
  536. int    PlayVTrack(tn)
  537. int    tn;
  538. {
  539.     int    st,len;
  540.  
  541.     st =Track[CDDA_TRACK].start_addr+vTrack[tn].start_addr;
  542.     len=vTrack[tn].track_len;
  543.     AbsPlay( SCSI_ID, st, len );
  544.  
  545.     return(0);
  546. }
  547.  
  548.  
  549.  
  550.  
  551.  
  552. int    Idle()
  553. {
  554. //    int    k;
  555.  
  556.  
  557.     if( Dev.kb[0]==0x02 ){        //ESCキー
  558.         exit_flag=TRUE;
  559.     }
  560.     
  561.     return(0);
  562. }
  563.  
  564.  
  565.  
  566. int    Term(mes)
  567. char    *mes;
  568. {
  569.     OS_CURON();
  570.     cls();
  571.     KFLUSHIO(0xff);
  572.     printf("%s\n",mes);
  573.  
  574.     return(0);
  575. }
  576.  
  577.  
  578.  
  579. int    Init(argc,argv)
  580. int    argc;
  581. char    *argv[];
  582. {
  583.     int    res=0;
  584.  
  585. //@@デフォルト
  586.     SCSI_ID=6;
  587.     CDDA_TRACK=2;
  588.  
  589.     {    //環境変数CDROMが設定されているか?
  590.         char    *p,buf[256];
  591.         p=getenv("CDROM");
  592.         if( p!=NULL ){
  593.             strcpy(buf,p);
  594.             SCSI_ID=atoi(buf);
  595.             //SCSI_ID=0はありえるけど
  596.             if( SCSI_ID==0 && buf[0]!='0' ){
  597.                 res=-1;
  598.                 goto quick_exit;
  599.             }
  600.         }
  601.     }
  602.     
  603.     if( argc!=1 ){    //トラック番号指定あるか
  604.         CDDA_TRACK=atoi(argv[1]);
  605.         if( CDDA_TRACK==0 ){
  606.             res=-1;
  607.             goto quick_exit;
  608.         }
  609.     }
  610.     
  611.     //デバク等
  612.     if( argc==3 ){
  613.         switch( argv[2][0] ){
  614.             case 'h':case 'H':
  615.                 HINT=1;
  616.             break;
  617.             case 'd':case 'D':
  618.                 DB=1;
  619.             break;
  620.             case '*':
  621.                 HINT=1;
  622.                 DB=1;
  623.             break;
  624.         }
  625.     }
  626.     
  627.     
  628.     srand(ONTIME());
  629.     OS_CUROF();
  630.     gameCondition=ALL_INIT;
  631.     
  632.     res=TOCRead(SCSI_ID);
  633.  
  634. //printf("ASDF JKL;で当てよう:ESCキーで終わり");
  635.  
  636. quick_exit:
  637.     return(res);
  638. }
  639.  
  640.  
  641.  
  642. int    Demo__Number;
  643. int    Demo__local_counter;
  644. int    Demo001()            //順番に鳴らす
  645. {
  646. #define    DEMOPLAY_INTV    (150)
  647.  
  648.     if( Dev.anskey!=0 ){
  649.         gameCondition=COUNTDOWN_INIT;
  650.     }
  651.  
  652.     if( (Demo__local_counter%DEMOPLAY_INTV)==0 ){
  653.         PlayNumber=Demo__local_counter/DEMOPLAY_INTV;
  654.         PrintAns();
  655.         PrintDirInfo();
  656.         PlayVTrack(PlayNumber);
  657.         goto quick_exit;
  658.     }
  659.  
  660.     if( (Demo__local_counter%60)==1 ){
  661.         PrintDemo(1);
  662.         goto quick_exit;
  663.     }
  664.     if( (Demo__local_counter%60)==31 ){
  665.         PrintDemo(0);
  666.         goto quick_exit;
  667.     }
  668.     
  669.     if( Demo__local_counter==(DEMOPLAY_INTV*(VTRACKS-1)-1) ){
  670.         gameCondition=DEMO_INIT;
  671.         goto quick_exit;
  672.     }
  673.  
  674. quick_exit:
  675.     Demo__local_counter++;
  676.     return(0);
  677. }
  678.  
  679. int    Demo002()            //バラバラにはやく鳴らす
  680. {
  681.     if( Dev.anskey!=0 ){
  682.         gameCondition=COUNTDOWN_INIT;
  683.     }
  684.  
  685.     if( (Demo__local_counter%(DEMOPLAY_INTV*3/4))==0 ){
  686.         PlayNumber=rand()%VTRACKS;
  687.         PrintAns();
  688.         PrintDirInfo();
  689.         PlayVTrack(PlayNumber);
  690.         goto quick_exit;
  691.     }
  692.  
  693.     if( (Demo__local_counter%60)==1 ){
  694.         PrintDemo(1);
  695.         goto quick_exit;
  696.     }
  697.     if( (Demo__local_counter%60)==31 ){
  698.         PrintDemo(0);
  699.         goto quick_exit;
  700.     }
  701.     
  702.     if( Demo__local_counter==(15*60) ){
  703.         gameCondition=DEMO_INIT;
  704.         goto quick_exit;
  705.     }
  706.  
  707.     //ごくたまに、仮想デモプレーヤーが入力@@まだ
  708.     if( (rand()%15)==(rand()%8) ){
  709. //        
  710.     }
  711.  
  712.     
  713. quick_exit:
  714.     Demo__local_counter++;
  715.     return(0);
  716. }
  717.  
  718.  
  719. int    Demo003()            //しずかに
  720. {
  721.     if( Dev.anskey!=0 ){
  722.         gameCondition=COUNTDOWN_INIT;
  723.     }
  724.  
  725.     if( (Demo__local_counter%60)==1 ){
  726.         PrintPush(1);
  727.         goto quick_exit;
  728.     }
  729.     if( (Demo__local_counter%60)==31 ){
  730.         PrintPush(0);
  731.         goto quick_exit;
  732.     }
  733.     
  734.     if( Demo__local_counter==(5*60) ){
  735.         gameCondition=DEMO_INIT;
  736.         goto quick_exit;
  737.     }
  738.  
  739. quick_exit:
  740.     Demo__local_counter++;
  741.     return(0);
  742. }
  743.  
  744.  
  745.  
  746.  
  747. int    SM__ALL_INIT()
  748. {
  749. cls();
  750.     gameCondition=DEMO_INIT;
  751.  
  752.     return(0);
  753. }
  754.  
  755. int    SM__DEMO_INIT()
  756. {
  757. cls();
  758.     PrintTitle();
  759.     switch( Demo__Number ){
  760.         case 1:    Demo__Number=2;    break;
  761.         case 2:    Demo__Number=3;    break;
  762.         case 3:    Demo__Number=4;    break;
  763.         case 4:    Demo__Number=1;    break;
  764.         default:Demo__Number=4;    break;
  765.     }
  766.     Demo__local_counter=0;
  767.     gameCondition=DEMO;
  768.  
  769.     return(0);
  770. }
  771.  
  772. int    SM__DEMO()
  773. {
  774.     switch( Demo__Number ){
  775.         case 1:    Demo001();    break;
  776.         case 3:    Demo002();    break;
  777.  
  778.         case 2:
  779.         case 4:    Demo003();    break;
  780.     }
  781. //    gameCondition=COUNTDOWN_INIT;
  782.  
  783.     return(0);
  784. }
  785.  
  786. int    SM__COUNTDOWN_INIT()
  787. {
  788.     totalCnt=0;
  789.     hitCnt=0;
  790.     outCnt=0;
  791.     karaburiCnt=0;
  792.     
  793.     gameLevel=0;
  794. cls();
  795. printf("用意:3秒後開始\x0d");
  796.     gameCondition=COUNTDOWN;
  797. AnswerTime=180;
  798. PlayStartTime=ONTIME();
  799.  
  800.     return(0);
  801. }
  802.  
  803. int    SM__COUNTDOWN()
  804. {
  805.     int    nt;
  806.     nt=ONTIME();
  807.     if( (PlayStartTime+AnswerTime)<=nt ){
  808. //printf("はじめ");
  809.         gameCondition=PLAY_TRACK;
  810.         goto quick_exit;
  811.     }
  812.  
  813. quick_exit:
  814.     return(0);
  815. }
  816.  
  817. int    SM__PLAY_TRACK()
  818. {
  819.     int    tn;        //tn
  820.  
  821.     if( TPALET0!=0 ){ TPALET0=0; }
  822.  
  823.     totalCnt++;
  824.     PrintInfo();
  825.     tn=rand()%VTRACKS;        //0~VTRACKS
  826.     PlayNumber=tn;
  827.     prohiTime=0;            //ASDF入力許可
  828.     AnswerTime=AnswerTimeTBL[gameLevel];//回答時間@@てきとー
  829. if(DB)printf("vTrack No.=%d ",tn);
  830. if(HINT)PrintAns();                //カンニング@@
  831.     PlayVTrack(tn);            //鳴らす
  832.     PlayStartTime=ONTIME();
  833.     
  834.     gameCondition=WAIT_ANSWER;
  835.  
  836.     return(0);
  837. }
  838.  
  839. int    SM__WAIT_ANSWER()
  840. {
  841.     int    nt;
  842.  
  843.     PrintSubInfo(1);    //タイマー表示
  844.  
  845.     nt=ONTIME();
  846.     if( (PlayStartTime+AnswerTime)<nt ){    //時間切れか?
  847.         gameCondition=TIMEOUT_ANSWER_INIT;
  848.         goto quick_exit;
  849.     }
  850.  
  851.     //正解チェック
  852.     if( Dev.anskey!=0 ){
  853.         int    *ht;
  854.  
  855. if(DB)printf("anskey=%d:",Dev.anskey);
  856.         ht=HitTable[Dev.anskey];
  857. if(DB)printf("addr=%x:",ht);
  858.         gameCondition=BAD_ANSWER_INIT;
  859.         while( *ht!=-1 ){
  860. if(DB)printf("%d:",*ht);
  861.             if( PlayNumber==*ht ){
  862.                 gameCondition=GOOD_ANSWER_INIT;
  863.                 break;
  864.             }
  865.             else{
  866.                 ht++;
  867.             }
  868.         }
  869.     }
  870.  
  871. quick_exit:
  872.     return(0);
  873.  
  874. }
  875.  
  876. int    SM__GOOD_ANSWER_INIT()
  877. {
  878. if(DB)printf("正解!");
  879.     ADPCMOUT(PCM_1005_001,0x0403,PCMSIZE_1005_001);
  880.     hitCnt++;
  881.     gameCondition=GOOD_ANSWER;
  882.  
  883.     return(0);
  884. }
  885.  
  886. int    SM__GOOD_ANSWER()
  887. {
  888.     gameCondition=WAIT_NEXT;
  889.  
  890.     return(0);
  891. }
  892.  
  893. int    SM__BAD_ANSWER_INIT()
  894. {
  895.     ADPCMOUT(PCM_AXE0004,0x0403,PCMSIZE_AXE0004);
  896.     karaburiCnt++;
  897.     prohiTime=prohiTimeTBL[gameLevel];        //@@入力禁止カウンタ
  898. if(DB)printf("間違い?");
  899.     gameCondition=BAD_ANSWER;
  900.  
  901.     return(0);
  902. }
  903.  
  904. int    SM__BAD_ANSWER()
  905. {
  906. //    gameCondition=WAIT_NEXT;
  907.     gameCondition=WAIT_ANSWER;
  908.  
  909.     return(0);
  910. }
  911.  
  912. int    SM__WAIT_NEXT()
  913. {
  914.     int    nt;
  915.  
  916.     PrintInfo();
  917.     PrintSubInfo(0);
  918.     nt=ONTIME();
  919.     if( (PlayStartTime+AnswerTime)<=nt ){    //次の再生時間まで待つ
  920.         gameCondition=LEVEL_CONTROL;
  921. //        gameCondition=PLAY_TRACK;
  922.         goto quick_exit;
  923.     }
  924.  
  925. quick_exit:
  926.     return(0);
  927. }
  928.  
  929. int    SM__TIMEOUT_ANSWER_INIT()
  930. {
  931.     TPALET0=0x0400;            //画面赤
  932.     outCnt++;
  933.     gameCondition=TIMEOUT_ANSWER;
  934.  
  935.     return(0);
  936. }
  937.  
  938. int    SM__TIMEOUT_ANSWER()
  939. {
  940.     gameCondition=WAIT_NEXT;
  941.  
  942.     return(0);
  943. }
  944.  
  945. int    SM__LEVEL_CONTROL()
  946. {
  947.     int    bo;
  948.  
  949.     if( totalCnt==60 ){
  950.         gameCondition=GAMEOVER_INIT;
  951.         goto quick_exit;
  952.     }
  953.  
  954. #define        CLRCHK        (5)
  955.  
  956.     if( (totalCnt%10)==0 ){        //次のレベルへ
  957.         bo=(hitCnt*10)/totalCnt;
  958.         if( bo>=CLRCHK ){
  959.             gameLevel++;    //次のレベルへ
  960.             gameCondition=PLAY_TRACK;
  961.         }
  962.         else{
  963.             gameCondition=GAMEOVER_INIT;
  964.         }
  965.     }
  966.     else{
  967.         gameCondition=PLAY_TRACK;
  968.     }
  969.  
  970. quick_exit:
  971.     return(0);
  972. }
  973.  
  974. #define        GAMEOVER_TIME    (60*10)    //10sec
  975. int    GAMEOVER__local_counter;
  976.  
  977. int    SM__GAMEOVER_INIT()
  978. {
  979.     char    *mes[7]={
  980.         NULL,
  981.         "次は頑張って",        //10
  982.         "その調子で頑張れ",    //20
  983.         "ここからが勝負",    //30
  984.         "油断大敵…かな",    //40
  985.         "頑張れ、もう少し",    //50
  986.         "良く頑張りました"    //60
  987.     };
  988.  
  989.     ADPCMOUT(PCM_1005_003,0x0403,PCMSIZE_1005_003);
  990.     GAMEOVER__local_counter=0;
  991.     if( hitCnt>HiScore ){
  992.         HiScore=hitCnt;
  993.     }
  994.     printf("%s\n",mes[totalCnt/10]);
  995.     printf("こっそり教えちゃウ。からぶり回数は%d回よん\n",karaburiCnt);
  996.     printf("→↓GAME OVER↓←");
  997.     gameCondition=GAMEOVER;
  998.  
  999.     return(0);
  1000. }
  1001.  
  1002. int    SM__GAMEOVER()
  1003. {
  1004.     GAMEOVER__local_counter++;
  1005.     if( GAMEOVER__local_counter>GAMEOVER_TIME ){
  1006.         gameCondition=DEMO_INIT;
  1007.         if( TPALET0!=0 ){ TPALET0=0; }
  1008.     }
  1009. //    exit_flag=TRUE;
  1010.  
  1011.     return(0);
  1012. }
  1013.  
  1014.  
  1015.  
  1016.  
  1017. int    StepMan()
  1018. {
  1019.     switch( gameCondition ){
  1020.         case ALL_INIT:        SM__ALL_INIT();            break;
  1021.  
  1022.         case DEMO_INIT:        SM__DEMO_INIT();        break;
  1023.         case DEMO:        SM__DEMO();            break;
  1024.  
  1025.         case COUNTDOWN_INIT:    SM__COUNTDOWN_INIT();        break;
  1026.         case COUNTDOWN:        SM__COUNTDOWN();        break;
  1027.  
  1028.         case PLAY_TRACK:    SM__PLAY_TRACK();        break;
  1029.         case WAIT_ANSWER:    SM__WAIT_ANSWER();        break;
  1030.  
  1031.         case GOOD_ANSWER_INIT:    SM__GOOD_ANSWER_INIT();        break;
  1032.         case GOOD_ANSWER:    SM__GOOD_ANSWER();        break;
  1033.         case BAD_ANSWER_INIT:    SM__BAD_ANSWER_INIT();        break;
  1034.         case BAD_ANSWER:    SM__BAD_ANSWER();        break;
  1035.         case TIMEOUT_ANSWER_INIT:SM__TIMEOUT_ANSWER_INIT();    break;
  1036.         case TIMEOUT_ANSWER:    SM__TIMEOUT_ANSWER();        break;
  1037.         case WAIT_NEXT:        SM__WAIT_NEXT();        break;
  1038.  
  1039.         case LEVEL_CONTROL:    SM__LEVEL_CONTROL();        break;
  1040.  
  1041.         case GAMEOVER_INIT:    SM__GAMEOVER_INIT();        break;
  1042.         case GAMEOVER:        SM__GAMEOVER();            break;
  1043.     }
  1044.  
  1045.     return(0);
  1046. }
  1047.  
  1048.  
  1049.  
  1050.  
  1051. int    main(argc,argv)
  1052. int    argc;
  1053. char    *argv[];
  1054. {
  1055.     int    res;
  1056.     int    tm=0;
  1057.     char    *mes[2]={
  1058.         "終了しました",
  1059.         "CD-ROMの準備等が出来ていないようです"
  1060.     };
  1061.  
  1062.     res=Init(argc,argv);
  1063.     if( res<0 ){
  1064.         tm=1;
  1065.         goto quick_exit;
  1066.     }
  1067.  
  1068.     while( exit_flag!=TRUE ){
  1069.         StepMan();
  1070.         DevMan();
  1071.         Idle();
  1072.         SyncMan();
  1073.     }
  1074.  
  1075. quick_exit:
  1076.     Term(mes[tm]);
  1077.     return(0);
  1078. }
  1079.  
  1080.  
  1081.  
  1082. /* [ EOF ] */
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.